import type { 不可能, 是, 否 } from './utils'
import type {
  零,
  一,
  二,
  三,
  四,
  五,
  六,
  七,
  八,
  九,
  相等,
  大于,
  小于,
  减一,
  加一,
} from './integer'

/**
 * 棋子位置
 */
export type 棋子横坐标 = 零 | 一 | 二 | 三 | 四 | 五 | 六 | 七 | 八
export type 棋子纵坐标 = 零 | 一 | 二 | 三 | 四 | 五 | 六 | 七 | 八 | 九

export type 最大横坐标 = 八
export type 最大纵坐标 = 九

export type 棋子坐标 = {
  横: 棋子横坐标
  纵: 棋子纵坐标
}

export type 构造棋子坐标<横坐标, 纵坐标> = 横坐标 extends 棋子横坐标
  ? 纵坐标 extends 棋子纵坐标
    ? {
        横: 横坐标
        纵: 纵坐标
      }
    : 不可能
  : 不可能

export type 相同位置<位置1, 位置2> = 位置1 extends 棋子坐标
  ? 位置2 extends 棋子坐标
    ? 相等<位置1['横'], 位置2['横']> & 相等<位置1['纵'], 位置2['纵']>
    : 不可能
  : 不可能

export type 左邻位<位置> = 位置 extends 棋子坐标
  ? 大于<位置['横'], 零> & 构造棋子坐标<减一<位置['横']>, 位置['纵']>
  : 不可能

export type 右邻位<位置> = 位置 extends 棋子坐标
  ? 小于<位置['横'], 最大横坐标> & 构造棋子坐标<加一<位置['横']>, 位置['纵']>
  : 不可能

export type 上邻位<位置> = 位置 extends 棋子坐标
  ? 大于<位置['纵'], 零> & 构造棋子坐标<位置['横'], 减一<位置['纵']>>
  : 不可能

export type 下邻位<位置> = 位置 extends 棋子坐标
  ? 小于<位置['纵'], 最大纵坐标> & 构造棋子坐标<位置['横'], 加一<位置['纵']>>
  : 不可能

/**
 * 开始测试
 */
type 相同位置0 = 相同位置<构造棋子坐标<零, 零>, 构造棋子坐标<零, 零>>
type 相同位置1 = 相同位置<构造棋子坐标<七, 八>, 构造棋子坐标<七, 八>>
type 相同位置2 = 相同位置<构造棋子坐标<二, 三>, 构造棋子坐标<二, 四>>
type 相同位置3 = 相同位置<构造棋子坐标<四, 五>, 构造棋子坐标<五, 五>>

type 左邻位0 = 相同位置<构造棋子坐标<零, 零>, 左邻位<构造棋子坐标<一, 零>>>
type 左邻位1 = 相同位置<构造棋子坐标<一, 零>, 左邻位<构造棋子坐标<零, 零>>>
type 左邻位2 = 相同位置<构造棋子坐标<二, 零>, 左邻位<构造棋子坐标<一, 零>>>
type 左邻位3 = 相同位置<构造棋子坐标<二, 零>, 左邻位<构造棋子坐标<一, 一>>>

type 右邻位0 = 相同位置<构造棋子坐标<零, 零>, 右邻位<构造棋子坐标<一, 零>>>
type 右邻位1 = 相同位置<构造棋子坐标<一, 零>, 右邻位<构造棋子坐标<零, 零>>>
type 右邻位2 = 相同位置<构造棋子坐标<二, 零>, 右邻位<构造棋子坐标<一, 零>>>
type 右邻位3 = 相同位置<构造棋子坐标<二, 零>, 右邻位<构造棋子坐标<一, 一>>>

type 上邻位0 = 相同位置<构造棋子坐标<零, 零>, 上邻位<构造棋子坐标<零, 一>>>
type 上邻位1 = 相同位置<构造棋子坐标<一, 零>, 上邻位<构造棋子坐标<零, 零>>>
type 上邻位2 = 相同位置<构造棋子坐标<二, 零>, 上邻位<构造棋子坐标<二, 一>>>
type 上邻位3 = 相同位置<构造棋子坐标<二, 零>, 上邻位<构造棋子坐标<一, 一>>>

type 下邻位0 = 相同位置<构造棋子坐标<零, 零>, 下邻位<构造棋子坐标<零, 一>>>
type 下邻位1 = 相同位置<构造棋子坐标<一, 零>, 下邻位<构造棋子坐标<零, 零>>>
type 下邻位2 = 相同位置<构造棋子坐标<二, 二>, 下邻位<构造棋子坐标<二, 一>>>
type 下邻位3 = 相同位置<构造棋子坐标<零, 二>, 下邻位<构造棋子坐标<零, 一>>>
